//package com.noah.project;
//
//import org.springframework.stereotype.Component;
//
//import javax.websocket.OnClose;
//import javax.websocket.OnMessage;
//import javax.websocket.OnOpen;
//import javax.websocket.Session;
//import javax.websocket.server.ServerEndpoint;
//import java.io.IOException;
//import java.util.List;
//import java.util.Map;
//import java.util.concurrent.ConcurrentHashMap;
//
//@ServerEndpoint(value = Const.API_WEB_SOCKET)
//@Component
//public class MyWebSocket {
//    //静态变量，用来记录当前在线连接数。应该把它设计成线程安全的。
//    private static int onlineCount = 0;
//
//    //concurrent包的线程安全Set，用来存放每个客户端对应的MyWebSocket对象。
//    //private static CopyOnWriteArraySet<MyWebSocket> webSocketSet = new CopyOnWriteArraySet<MyWebSocket>();
//    private static ConcurrentHashMap<String, MyWebSocket> socketMap = new ConcurrentHashMap<>();
//
//    //与某个客户端的连接会话，需要通过它来给客户端发送数据
//    private Session session;
//    private String uid;
//
//    /**
//     * 连接建立成功调用的方法
//     */
//    @OnOpen
//    public void onOpen(Session session) {
//        this.session = session;
//        Map<String, List<String>> map = session.getRequestParameterMap();
//        for (Map.Entry<String, List<String>> entry : map.entrySet()) {
//            System.out.println("key= " + entry.getKey() + " and value= " + entry.getValue());
//            uid = entry.getValue().get(0);
//            if (socketMap.containsKey(uid)) {
//                socketMap.remove(uid);
//            }
//            socketMap.put(uid, this);
//        }
//        //webSocketSet.add(this);     //加入set中
//        addOnlineCount();           //在线数加1
//        System.out.println("有新连接加入！当前在线人数为" + getOnlineCount());
//        try {
//            sendMessage("连接成功");
//        } catch (IOException e) {
//            System.out.println("websocket IO异常");
//        }
//    }
//
//    /**
//     * 连接关闭调用的方法
//     */
//    @OnClose
//    public void onClose() {
//        if (socketMap.containsKey(uid)) {
//            socketMap.remove(uid);
//        }
//        //webSocketSet.remove(this);  //从set中删除
//        subOnlineCount();           //在线数减1
//        System.out.println("有一连接关闭！当前在线人数为" + getOnlineCount());
//    }
//
//    /**
//     * 收到客户端消息后调用的方法
//     *
//     * @param message 客户端发送过来的消息
//     */
//    @OnMessage
//    public void onMessage(String message, Session session) {
//        System.out.println("来自客户端的消息:" + message);
//
//        try {
//            /*for (MyWebSocket item : webSocketSet) {
//                //群发消息
//                item.sendMessage(message);
//            }*/
//            for (Map.Entry<String, MyWebSocket> entry : socketMap.entrySet()) {
//                if(!entry.getKey().equals(uid)){//群发消息,不包含自己
//                    entry.getValue().sendMessage(message);
//                }
//            }
//        } catch (IOException e) {
//            e.printStackTrace();
//        }
//
//    }
//
//    public void sendMessage(String message) throws IOException {
//        this.session.getBasicRemote().sendText(message);
//    }
//
//
//    /**
//     * 发生错误时调用
//     *
//     * @OnError public void onError(Session session, Throwable error) {
//     * System.out.println("发生错误");
//     * error.printStackTrace();
//     * }
//     * <p>
//     * <p>
//     * public void sendMessage(String message) throws IOException {
//     * this.session.getBasicRemote().sendText(message);
//     * //this.session.getAsyncRemote().sendText(message);
//     * }
//     * <p>
//     * <p>
//     */
//
//
//    public static synchronized int getOnlineCount() {
//        return onlineCount;
//    }
//
//    public static synchronized void addOnlineCount() {
//        MyWebSocket.onlineCount++;
//    }
//
//    public static synchronized void subOnlineCount() {
//        MyWebSocket.onlineCount--;
//    }
//}